// 版权所有 Epic Games, Inc. 保留所有权利。

#pragma once

#include "CommonGameInstance.h"

#include "LyraGameInstance.generated.h"

#define UE_API LYRAGAME_API

class ALyraPlayerController;
class UObject;

UCLASS(MinimalAPI, Config = Game)
class ULyraGameInstance : public UCommonGameInstance
{
	GENERATED_BODY()

public:

	/**
	 * 构造函数
	 * @param ObjectInitializer 对象初始化器
	 */
	UE_API ULyraGameInstance(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());

	/**
	 * 获取主玩家控制器
	 * @return 返回主玩家控制器指针
	 */
	UE_API ALyraPlayerController* GetPrimaryPlayerController() const;
	
	/**
	 * 检查是否可以加入请求的会话
	 * @return 如果可以加入返回true，否则返回false
	 */
	UE_API virtual bool CanJoinRequestedSession() const override;
	
	/**
	 * 处理用户初始化完成
	 * @param UserInfo 用户信息
	 * @param bSuccess 是否成功
	 * @param Error 错误信息
	 * @param RequestedPrivilege 请求的权限
	 * @param OnlineContext 在线上下文
	 */
	UE_API virtual void HandlerUserInitialized(const UCommonUserInfo* UserInfo, bool bSuccess, FText Error, ECommonUserPrivilege RequestedPrivilege, ECommonUserOnlineContext OnlineContext) override;

	/**
	 * 接收网络加密令牌
	 * @param EncryptionToken 加密令牌
	 * @param Delegate 加密密钥响应委托
	 */
	UE_API virtual void ReceivedNetworkEncryptionToken(const FString& EncryptionToken, const FOnEncryptionKeyResponse& Delegate) override;
	
	/**
	 * 接收网络加密确认
	 * @param Delegate 加密密钥响应委托
	 */
	UE_API virtual void ReceivedNetworkEncryptionAck(const FOnEncryptionKeyResponse& Delegate) override;

protected:

	/**
	 * 初始化游戏实例
	 */
	UE_API virtual void Init() override;
	
	/**
	 * 关闭游戏实例
	 */
	UE_API virtual void Shutdown() override;

	/**
	 * 在客户端旅行到会话前的处理
	 * @param URL 旅行URL
	 */
	UE_API void OnPreClientTravelToSession(FString& URL);

	/** 用于测试加密代码的硬编码加密密钥。这不安全，不要在生产环境中使用此技术！ */
	TArray<uint8> DebugTestEncryptionKey;
};

#undef UE_API